WAX技术指南第七期:如何构建WAX状态历史节点
原文:EOSphere (Ross Dold) 翻译:WAX Eastern (NFT Gamer)
在之前的技术指南文章中,我们介绍了构建可靠的 WAX 主网 API 和 P2P 节点的过程。
然而,还有另一种节点实现类型对于许多 WAX 主网服务(例如 Hyperion Full History 和 Atomic Assets API)的运行至关重要,那就是状态历史服务(State-History service)。
第 7 期 WAX 技术指南将向您展示如何构建、配置和部署节点以提供状态历史功能,也称为状态历史协议 (SHIP) 节点。
如何设置 WAX 状态历史节点
nodeos 使用 State-History 插件来捕获有关区块链状态(在本例中为 WAX 主网)的历史数据,并将此数据存储为外部可读的平面文件格式。
此插件会打开一个 websocket 接口,多个同时的外部服务(如 Hyperion 和 Atomic)可以利用该接口简单有效地读取此数据。
考虑到外部服务在 SHIP 节点上的依赖程度,公会提供可靠的可扩展服务至关重要,该服务可以扩展以满足 WAX 主网不断扩张的需求。
本文将介绍一个当前有效(2022 年 9 月)并由 EOSphere Guild 使用的示例,EOSphere Guild 为我们自己和其他公会的服务提供多个 websocket 连接。
主网要求
硬件
4 核 CPU / 4Ghz+
(1) 256GB+ 磁盘/企业级 SSD 或 NVMe(高耐久性要求)
(2) 10TB+ 磁盘/SAS 或 SATA 都可以,但首选 SSD 或 NVMe
2.1T ./blocks
5.7T ./state-history
7.8T .
128GB+ 内存
操作系统
Ubuntu 18.04
Ubuntu 20.04(推荐)
Ubuntu 22.04
互联网
现代宽带/光纤连接(100Mb/s 同步及以上)
准备操作系统环境
在构建和配置 WAX 软件之前,本例中的操作系统环境 Ubuntu 20.04 需要针对性能进行配置,并承担负载。
泽字节文件系统 (ZFS)
此节点构建使用两个独立的 SAS 磁盘来平衡磁盘 IO 并为 /blocks 和 /state-history 目录提供更实惠的存储选项,这些目录目前总计 8TB,并且还在不断增长。
磁盘 1 是高速企业级 SSD 或 NVMe,将是用于 WAX 软件所有配置和状态文件的操作系统磁盘。状态文件是IO 密集型的,基于消费者的 SSD 的寿命将由于大量写入而变短,因此需要使用高耐久性企业 SSD 或 NVMe。
注意:如果您有足够的可用空间,可以在内存中运行这些状态文件,这个主题将在以后的文章中介绍。
在此示例中,磁盘 1 将运行默认的操作系统 Ext4 文件系统,该系统已在 Ubuntu 20.04 安装期间同时安装。
磁盘 2 是大容量 SATA 或 SAS 磁盘,将托管 /blocks 和 /state-history 目录。这些目录的 IO 需求远低于状态文件,速度较慢、容量较大的基于心轴的磁盘仍然适用。
在此示例中,磁盘 2 将运行 ZFS 文件系统,这将给我们带来两个主要好处。ZFS 将使我们能够使用 LZ4 压缩,并将通过自适应替换缓存 (ARC) 改进磁盘 IO。压缩将仅用于 /blocks 目录(目前是 1.3x 的增益),因为对已经优化的状态历史平面文件没有任何好处。
使用以下配置在磁盘 2 上运行 ZFS:
#Install ZFS
> sudo apt-get install zfsutils-linux
#Locate the Disk 2 device name
> lsblk
#Create ZFS Pool called "datavolume" on device "sdb"
> sudo zpool create datavolume /dev/sdb
#Enable LZ4 compression
> sudo zfs set compression=lz4 datavolume
#Disable ZFS access time Updates
> sudo zfs set atime=off datavolume
#Set ARC to only cache metadata
> sudo zfs set primarycache=all datavolume
#Set the mountpoint location to your preferred location
> sudo zfs set mountpoint=/home/eosphere/datavolume datavolume
#Create the specific folders for /blocks and /state-history
> mkdir /home/eosphere/datavolume/blocks
> mkdir /home/eosphere/datavolume/state-history
#Set specific mountpoint for /blocks and /state-history
> sudo zfs create -o mountpoint=/home/eosphere/datavolume/blocks datavolume/blocks
> sudo zfs create -o mountpoint=/home/eosphere/datavolume/state-history datavolume/state-history
#Turn off lz4 compression on the state-history mountpoint
> sudo zfs set compression=none datavolume/state-history
#Verify ZFS Settings
> zfs get all
网络时间协议 (NTP)
对于全球网状区块链来说,跨所有节点同步时间至关重要。
Chrony 是一个优秀的 NTP 客户端,非常适合 WAX 主网的需求。
安装、配置和验证如下:
#Install Chrony
> sudo apt install chrony
#If necessary manually add local peers, these are AU servers
> sudo nano /etc/chrony/chrony.conf
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server 3.pool.ntp.org
#Restart Chrony
> sudo /etc/init.d/chrony restart
#Verify
> chronyc sources -v
> chronyc tracking
#Set your local timezone if necessary
> sudo timedatectl set-timezone Australia/Perth
堆栈限制和打开文件
WAX 软件内存寻址和生产主网节点将收到的 API 请求数量要求增加 Ubuntu 20.04 默认堆栈限制和打开文件数量。
配置并验证提高的限制,如下所示:
> sudo nano /etc/systemd/system.conf
#Append the following configuration
DefaultLimitNOFILE=64000
DefaultLimitSTACK=65536000
#Restart server and verify
> ulimit -a
构建软件
WAX 软件源自开源 Antelope 软件,但经过修改以适应 WAX 协议网络的需要。
目前,WAX Block Producer 接受的软件构建和版本是 v3.1.0wax01 ,由 EOS 阿姆斯特丹公会成员 cc32d9 创建。
最新的 wax 构建标签目前在 cc32d9 Github 上可用。
构建过程
此示例使用 Ubuntu Linux 按照以下过程从源代码构建 WAX 软件:
> cd ~
> sudo apt install -y file
> git clone https://github.com/cc32d9/wax-leap.git
> cd wax-leap
> git checkout v3.1.0.wax01
> git submodule update --init --recursive
> sudo bash scripts/install_deps.sh
> mkdir build
# If necessary supplement $(nproc) below with the number of jobs your server can sustain, I suggest 4GB RAM required / job
> nice bash scripts/pinned_build.sh ~/wax-leap/build/leap-deps ~/wax-leap/build $(nproc)
# Binaries are located in ~/wax-leap/build/programs
配置
现在已经编译了一个干净的 WAX 软件版本,让我们开始为 WAX 主网操作配置状态历史。
要配置和启动节点,将使用 nodeos , nodeos 是在每个 WAX 协议网络节点上运行的核心服务守护程序。
nodeos 可以配置为处理智能合约、验证交易、生成包含有效交易的块,并确认块以将它们记录在区块链上。
nodeos 的主要操作功能是: 将其作为区块生产者、网络 API 端点、P2P 种子节点或状态历史节点运行。通常在 WAX 主网等繁忙的网络上,您会想要在物理上分散的服务器上分离这些功能。
在此 WAX 主网示例中,您将使您的节点连接到其他网络对等点,并作为可用于 API 和 Websocket 连接的状态历史 (SHIP) 节点。
nodeos 需要两个文件来连接到对等点并在 WAX 主网上运行:
Config.ini
按照以下命令运行不带配置的 nodeos 来创建默认的 config.ini :
> mkdir ~/waxdata
> cd ~/wax-leap/build/programs/nodeos
> ./nodeos --data-dir ~/waxdata --config-dir ~/waxdata
然后您将能够编辑新创建的 config.ini 并查看所有可用参数:
> cd ~/waxdata
> nano config.ini
现在编辑 config.ini 并添加以下配置设置:
# the location of the blocks directory on Disk 2
blocks-dir = /home/eosphere/datavolume/blocks
wasm-runtime = eos-vm-jit
chain-state-db-size-mb = 131072
chain-state-db-guard-size-mb = 1024
read-mode = head
http-server-address = 0.0.0.0:8888
access-control-allow-origin = *
access-control-allow-headers = Origin, X-Requested-With, Content-Type, Accept
http-max-response-time-ms = 100
verbose-http-errors = true
http-validate-host = false
p2p-listen-endpoint = 0.0.0.0:9876
# 3dkrenderwax: FI, wax-peer
p2p-peer-address = peer.3dkrender.com:9880
# 3dkrenderwax: FI, query
p2p-peer-address = query.3dkrender.com:9880
# amsterdamwax: NL, Amsterdam
p2p-peer-address = wax.eu.eosamsterdam.net:9101
# amsterdamwax: US, Washington, D.C.
p2p-peer-address = waxp2p.us.eosamsterdam.net:9101
# blokcrafters: CA, Montreal, Quebec
p2p-peer-address = wax-peer-ca.blokcrafters.io:9876
# blokcrafters: FI, Helsinki, Uusimaa
p2p-peer-address = wax-peer-eu.blokcrafters.io:9876
# bp.box: KY, Cayman Islands
p2p-peer-address = wax.defibox.xyz:9966
# bp.wecan: GB, London
p2p-peer-address = seed2-wax-mainnet.wecan.dev:14998
# bp.wecan: US, NewYork
p2p-peer-address = seed3-wax-mainnet.wecan.dev:14998
# cryptolions1: DE, Germany-Finland
p2p-peer-address = wax.cryptolions.io:9876
# dapplica: DE, Germany-Finland
p2p-peer-address = wax.dapplica.io:9876
# eosauthority: DE, Falkenstein
p2p-peer-address = node-wax.eosauthority.com:10301
# eosauthority: FI, Helsinki
p2p-peer-address = node-wax-p2p.eosauthority.com:10301
# eosdacserver: GB, United Kingdom
p2p-peer-address = wax-p2p.eosdac.io:29876
# eosdublinwow: FI, Finland
p2p-peer-address = wax.p2p.eosdublin.io:9876
# eoseouldotio: JP, Seoul
p2p-peer-address = p2p.wax.eoseoul.io:29876
# eosphereiobp: CA, Beauharnois
p2p-peer-address = peer1-wax.eosphere.io:9876
# eosphereiobp: CA, Beauharnois
p2p-peer-address = peer2-wax.eosphere.io:9876
# greeneosiobp: DE, Germany
p2p-peer-address = p2p1.wax.greeneosio.com:9876
# guild.nefty: DE, Germany
p2p-peer-address = p2p-node1.neftyblocks.com:9876
# guild.nefty: FI, Finland
p2p-peer-address = p2p-node2.neftyblocks.com:9876
# ledgerwiseio: FI, LB
p2p-peer-address = waxp2p.ledgerwise.io:21877
# nation.wax: CA, Canada
p2p-peer-address = wax.seed.eosnation.io:9876
# oneinacilian: GB, United Kingdom
p2p-peer-address = p2p.oiac.io:9876
# sentnlagents: GB, United Kingdom
p2p-peer-address = waxp2p.sentnl.io:9876
# tokengamerio: DE, Germany
p2p-peer-address = peer2.wax.tgg.gg:9876
# waxhiveguild: FI, Finnland
p2p-peer-address = peer1.hivebp.io:9876
# waxhiveguild: DE, Germany
p2p-peer-address = peer2.hivebp.io:9876
# waxmadrid111: DE, SEED
p2p-peer-address = wax-seed.eosiomadrid.io:9876
# waxswedenorg: SE, Sweden
p2p-peer-address = p2p.waxsweden.org:35777
# PeerList - https://validate.eosnation.io/wax/reports/config.html
agent-name = "<yourname> WAX Mainnet State-History"
sync-fetch-span = 500
state-history-dir = /home/eosphere/datavolume/state-history
trace-history = true
chain-state-history = true
state-history-endpoint = 0.0.0.0:8080
plugin = eosio::http_plugin
plugin = eosio::state_history_plugin
plugin = eosio::chain_plugin
plugin = eosio::chain_api_plugin
Genesis.json
这些是 WAX 主网上每个新的起始节点所需的初始状态参数。创建文件如下:
> cd ~/waxdata
> nano genesis.json
将以下参数添加到 WAX 公共主网的 genesis.json 文件中:
{
"initial_timestamp": "2019-06-05T12:00:00.000",
"initial_key": "EOS8i2pkwtv2JmdYWNJdcy5BcJ7wCE5q6mpE1hwT25HdgHMzeRday",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 500000,
"target_block_cpu_usage_pct": 2000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
}
}
运行节点
现在已经配置了config.ini 并创建了初始 WAX 主网链参数 genesis.json ,您现在可以加入网络并同步节点。
使用Screen即使在断开连接时也能使您的会话保持活动状态,用法如下:
#Create a new screen session
> screen -US wax
#Disconnect screen session
> ctrl-a+d
#Reconnect screen session
> screen -r wax
使用指向配置、数据目录和创世文件的指针运行节点:
> cd ~/wax-leap/build/programs/nodeos
> ./nodeos --data-dir ~/waxdata --config-dir ~/waxdata --genesis-json ~/waxdata/genesis.json --disable-replay-opts
您的 WAX 主网节点现在将开始与配置的对等节点同步,并赶上 WAX 主网链头块。
在撰写本文时(2022 年 9 月),这可能需要长达一个月的时间才能从创世同步完整的区块。如果您选择一些距离较近的对等点以限制对等点过载并确保低延迟,也可能会有所帮助。
当您的节点从链的开头开始同步时,它将在 /blocks 和 /state-history 目录中构建日志和索引文件。
您的节点将可通过 http 端口 8888 进行查询访问,并通过 ws 端口 8080 进行状态历史访问。
防失联,加入橘猫玩家公会:
Telegram:https://t.me/NFTGamerChina
Discord:https://discord.gg/NU82sXeTNs
阅读原文,获取详细信息